package cn.com.shadowless.basepopview.event;

import android.view.View;

import androidx.viewbinding.ViewBinding;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import cn.com.shadowless.basepopview.base.PopCons;

/**
 * 弹窗公共事件接口
 *
 * @author sHadowLess
 */
public interface PopPublicEvent {

    /**
     * 视图绑定初始化接口
     *
     * @param <VB> ViewBinding类型参数
     */
    interface InitViewBinding<VB extends ViewBinding> {
        /**
         * 资源类型常量
         */
        String DEF_TYPE = "layout";


        /**
         * 获取ViewBinding泛型类型数组
         *
         * @param o 当前对象实例
         * @return 泛型类型数组
         */
        default Type[] getViewBindingGenericsClass(Object o) {
            Type superClass = o.getClass().getGenericSuperclass();
            ParameterizedType parameterized = (ParameterizedType) superClass;
            return parameterized.getActualTypeArguments();
        }

        /**
         * 初始化ViewBinding泛型类
         *
         * @param o 当前对象实例
         * @return ViewBinding类对象
         */
        default Class<VB> initViewBindingGenericsClass(Object o) {
            Type[] types = getViewBindingGenericsClass(o);
            for (Type type : types) {
                Class<?> genericsCls = (Class<?>) type;
                if (!ViewBinding.class.isAssignableFrom(genericsCls)) {
                    continue;
                }
                if (genericsCls == ViewBinding.class) {
                    genericsCls = setBindViewClass();
                }
                if (genericsCls == null) {
                    throw new RuntimeException("实现动态ViewBinding，请重写setBindViewClass方法");
                }
                return (Class<VB>) genericsCls;
            }
            throw new RuntimeException("传入的泛型未找到与ViewBinding相关的泛型超类，请检查参数或手动初始化ViewBinding");
        }

        /**
         * 设置绑定视图类
         *
         * @return ViewBinding类对象
         */
        default Class<VB> setBindViewClass() {
            return null;
        }

        /**
         * 通过反射创建ViewBinding实例
         *
         * @param o    当前对象实例
         * @param view 布局视图
         * @return ViewBinding实例
         * @throws InvocationTargetException 调用目标异常
         * @throws IllegalAccessException    非法访问异常
         * @throws NoSuchMethodException     方法不存在异常
         */
        default VB inflateView(Object o, View view) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
            Method inflateMethod = initViewBindingGenericsClass(o).getMethod("bind", View.class);
            return (VB) inflateMethod.invoke(null, view);
        }

        /**
         * 根据Binding类名获取对应的布局文件名
         *
         * @param cls ViewBinding类
         * @return 布局文件名
         */
        default String getLayoutNameByBindingClass(Class<?> cls) {
            StringBuilder builder = new StringBuilder();
            boolean isFirst = true;
            String name = cls.getSimpleName();
            for (int i = 0; i < name.length(); i++) {
                char temp = name.charAt(i);
                if (Character.isUpperCase(temp)) {
                    if (!isFirst) {
                        builder.append("_");
                    }
                    isFirst = false;
                }
                builder.append(temp);
            }
            String layoutName = builder.toString();
            layoutName = layoutName.substring(0, layoutName.lastIndexOf("_")).toLowerCase();
            return layoutName;
        }
    }


    /**
     * 视图点击事件初始化接口
     */
    interface InitViewClick extends View.OnClickListener {
        /**
         * 判断是否为快速点击
         *
         * @param time 时间间隔阈值
         * @return true表示快速点击，false表示非快速点击
         */
        default boolean isFastClick(int time) {
            long currentTime = System.currentTimeMillis();
            long timeInterval = currentTime - PopCons.lastClickTime;
            if (0 < timeInterval && timeInterval < time) {
                return true;
            }
            PopCons.lastClickTime = currentTime;
            return false;
        }

        /**
         * 防抖点击事件处理
         *
         * @param v 被点击的视图
         */
        default void antiShakingClick(View v) {

        }

        @Override
        default void onClick(View v) {
            if (!isFastClick(PopCons.TIME)) {
                antiShakingClick(v);
            }
        }
    }

    /**
     * 事件初始化接口
     */
    interface InitEvent {
        /**
         * 是否使用默认背景颜色
         *
         * @return true使用默认背景，false不使用默认背景
         */
        boolean isDefaultBackground();

        /**
         * 初始化对象
         */
        void initObject();

        /**
         * 初始化视图
         */
        void initView();

        /**
         * 初始化视图监听器
         */
        void initViewListener();

        /**
         * 初始化数据监听器
         */
        void initDataListener();

        /**
         * 初始化数据
         */
        void initData();

        /**
         * 更新数据
         */
        default void updateData() {

        }
    }
}